<?php
/**
 * 自定义错误处理器
 * set_error_handler(array('MyError','handlerError'));
 */
class ErrorHandler{
	protected $errno;
	protected $errmsg;
	protected $errfile;
	protected $errline;
	protected $errcontent=array();

	public function __construct($errmsg,$errfile,$errline,$errcontent){
		$this->errmsg=$errmsg;
		$this->errfile=$errfile;
		$this->errline=$errline;
		$this->errcontent=$errcontent;
	}
	
	public static function handlerError($errno,$errmsg,$errfile,$errline,$errcontent=[]){
		//静态方法中使用类构造函数的方法
		$sel=new MyError($errmsg,$errfile,$errline,$errcontent);
		switch ($errno) {
			case E_USER_NOTICE:
			case E_NOTICE:
				$sel->myNotice();
				break;
			case E_USER_WARNING:
			case E_WARNING:
				$sel->myWarning();
				break;
			case E_USER_ERROR:
				$sel->myError();
				break;
			default:
				return false;
		}
	}
	/*----------------------------[myNotice]------------------------------
	 * [作用]:处理notice错误
	 * [描述]:将错误信息写入日志文件中
	------------------------------------------------------------------*/
	public function myNotice(){
		$datetime=date("Y-m-d H:i:s");
		// echo $this->errmsg;
		$str=<<<heredoc
产生通知错误的文件:{$this->errfile}
产生通知错误的信息:{$this->errmsg}
产生通知错误的行号:{$this->errline}
产生通知错误的时间:{$datetime}
heredoc;
echo $str;
		error_log($str,3,'./log/myerror.log');		
	}

	/*----------------------------[mywaring]------------------------------
	 * [作用]:将错误信息发送邮件
	 * [描述]:错误信息包括debug_backtrace信息
	------------------------------------------------------------------*/
	public function myWarning(){
		$datetime=date("Y-m-d H:i:s");
		ob_start();
		debug_print_backtrace();
		$debug=ob_get_flush();
		//获取缓冲区内容以字符串形式返回
		ob_clean();
		// echo $this->errmsg;
		$str=<<<heredoc
产生warning错误的文件:{$this->errfile}
产生warning错误的信息:{$this->errmsg}
产生warning错误的行号:{$this->errline}
产生warning错误的时间:{$datetime}
产生warning错误的trace信息:{$debug}
heredoc;
		error_log($str,1,'manbudezhu@163.com');		
	}
	/*----------------------------[处理致命错误]------------------------------
	 * [描述]:set_error_handler无法捕获E_ERROR类型的的错误,只能处理E_USER_ERROR的错误
	 * [步骤]:显示提示信息,终止程序执行 (略)
	------------------------------------------------------------------*/
	public function myError(){
		echo 'i am error';
		exit(0);
	}
}
